// Excel导出工具类
// 使用本地的xlsx.mini.min.js库
const XLSX = require('./xlsx.mini.min.js');

/**
 * 导出患者评估详细报告
 */
async function exportPatientAssessmentReport(patientInfo, validatedData, detailedData, timeRange) {
  try {
    // 创建工作簿
    const wb = XLSX.utils.book_new();
    
    // 1. 创建汇总表
    createSummarySheet(wb, patientInfo, validatedData, timeRange);
    
    // 2. 创建按日期分组表
    createDateGroupedSheet(wb, validatedData);
    
    // 3. 创建统计分析表
    createStatisticsSheet(wb, validatedData);
    
    // 4. 为每次评估创建详细量表（如果有详细数据）
    if (detailedData && detailedData.length > 0) {
      detailedData.forEach((detail, index) => {
        // 只为前10次评估创建详细表（避免文件过大）
        if (index < 10) {
          if (detail.scaleDetails?.hamd && detail.scaleDetails.hamd.length > 0) {
            createHAMDDetailSheet(wb, detail, index);
          }
          if (detail.scaleDetails?.hama && detail.scaleDetails.hama.length > 0) {
            createHAMADetailSheet(wb, detail, index);
          }
          if (detail.scaleDetails?.ymrs && detail.scaleDetails.ymrs.length > 0) {
            createYMRSDetailSheet(wb, detail, index);
          }
        }
      });
    }
    
    // 生成并保存文件
    return saveWorkbook(wb, patientInfo, timeRange);
    
  } catch (error) {
    console.error('生成Excel失败:', error);
    throw error;
  }
}

/**
 * 创建汇总表（Sheet1）
 */
function createSummarySheet(wb, patientInfo, assessments, timeRange) {
  const data = [
    ['患者评估汇总报告'],
    [],
    ['患者信息'],
    ['姓名', patientInfo?.real_name || '未知'],
    ['性别', patientInfo?.gender === 1 ? '男' : '女'],
    ['年龄', patientInfo?.age || ''],
    ['手机', patientInfo?.phone || ''],
    ['时间范围', timeRange || ''],
    ['评估总次数', assessments.length],
    [],
    // 表头
    ['序号', '评估日期', '评估时间', '评估类型', '评估者', 'HAMD总分', 'HAMD严重度', 'HAMA总分', 'HAMA严重度', 'YMRS总分', 'YMRS严重度', '完成量表', '数据质量', '备注']
  ];
  
  // 数据行
  assessments.forEach((item, index) => {
    data.push([
      index + 1,
      item.assessment_date || '',
      getTimeFromDateTime(item.create_time) || '',
      item.assessment_type_name || '',
      item.assessor_name || '',
      item.hamd_status === 1 ? item.hamd_total : '-',
      item.hamd_status === 1 ? getSeverity('hamd', item.hamd_total) : '未测',
      item.hama_status === 1 ? item.hama_total : '-',
      item.hama_status === 1 ? getSeverity('hama', item.hama_total) : '未测',
      item.ymrs_status === 1 ? item.ymrs_total : '-',
      item.ymrs_status === 1 ? getSeverity('ymrs', item.ymrs_total) : '未测',
      item.completed_scales || '',
      item.data_quality || '',
      item.assessment_notes || ''
    ]);
  });
  
  const ws = XLSX.utils.aoa_to_sheet(data);
  
  // 设置列宽
  ws['!cols'] = [
    { wch: 6 }, { wch: 12 }, { wch: 8 }, { wch: 10 }, { wch: 12 },
    { wch: 10 }, { wch: 12 }, { wch: 10 }, { wch: 12 }, { wch: 10 },
    { wch: 12 }, { wch: 12 }, { wch: 10 }, { wch: 30 }
  ];
  
  XLSX.utils.book_append_sheet(wb, ws, '评估汇总');
}

/**
 * 创建按日期分组表（Sheet2）
 */
function createDateGroupedSheet(wb, assessments) {
  // 按日期分组
  const groupedByDate = {};
  assessments.forEach(item => {
    const date = item.assessment_date;
    if (!groupedByDate[date]) {
      groupedByDate[date] = [];
    }
    groupedByDate[date].push(item);
  });
  
  const data = [
    ['按日期分组统计'],
    []
  ];
  
  // 遍历每个日期
  const dates = Object.keys(groupedByDate).sort().reverse();
  dates.forEach(date => {
    const items = groupedByDate[date];
    
    // 日期分隔行
    data.push([`━━━ ${date}（${items.length}次评估）━━━`]);
    
    // 该日期的表头
    data.push(['时间', '评估类型', '评估者', 'HAMD', 'HAMA', 'YMRS', '完成量表', '备注']);
    
    // 该日期的数据
    items.forEach(item => {
      data.push([
        getTimeFromDateTime(item.create_time),
        item.assessment_type_name || '',
        item.assessor_name || '',
        item.hamd_status === 1 ? `${item.hamd_total}(${getSeverity('hamd', item.hamd_total)})` : '-',
        item.hama_status === 1 ? `${item.hama_total}(${getSeverity('hama', item.hama_total)})` : '-',
        item.ymrs_status === 1 ? `${item.ymrs_total}(${getSeverity('ymrs', item.ymrs_total)})` : '-',
        item.completed_scales || '',
        item.assessment_notes || ''
      ]);
    });
    
    data.push([]); // 空行分隔
  });
  
  const ws = XLSX.utils.aoa_to_sheet(data);
  ws['!cols'] = [
    { wch: 8 }, { wch: 10 }, { wch: 12 }, { wch: 15 },
    { wch: 15 }, { wch: 15 }, { wch: 12 }, { wch: 30 }
  ];
  
  XLSX.utils.book_append_sheet(wb, ws, '按日期分组');
}

/**
 * 创建统计分析表（Sheet3）
 */
function createStatisticsSheet(wb, assessments) {
  // 有效评估（排除空白和无效）
  const validAssessments = assessments.filter(a => 
    a.data_quality !== '✗ 空白' && a.data_quality !== '✗ 无效'
  );
  
  // HAMD统计
  const hamdScores = validAssessments
    .filter(a => a.hamd_status === 1)
    .map(a => a.hamd_total);
  
  const hamdStats = calculateStats(hamdScores);
  
  const data = [
    ['统计分析报告'],
    [],
    ['评估频率分析'],
    ['总评估次数', assessments.length],
    ['有效评估', validAssessments.length],
    ['无效/空白', assessments.length - validAssessments.length],
    [],
    ['HAMD分数统计'],
    ['样本数', hamdStats.count],
    ['最高分', hamdStats.max],
    ['最低分', hamdStats.min],
    ['平均分', hamdStats.avg],
    ['中位数', hamdStats.median],
    [],
    ['严重度分布'],
    ['正常 (<7分)', hamdStats.severity.normal],
    ['轻度抑郁 (7-16分)', hamdStats.severity.mild],
    ['中度抑郁 (17-23分)', hamdStats.severity.moderate],
    ['重度抑郁 (>24分)', hamdStats.severity.severe]
  ];
  
  const ws = XLSX.utils.aoa_to_sheet(data);
  ws['!cols'] = [{ wch: 20 }, { wch: 15 }];
  
  XLSX.utils.book_append_sheet(wb, ws, '统计分析');
}

/**
 * 创建HAMD详情表
 */
function createHAMDDetailSheet(wb, detail, index) {
  const hamdQuestions = [
    '1. 抑郁情绪', '2. 罪恶感', '3. 自杀', '4. 入睡困难',
    '5. 睡眠不深', '6. 早醒', '7. 工作和兴趣', '8. 迟滞',
    '9. 激越', '10. 精神性焦虑', '11. 躯体性焦虑', '12. 胃肠道症状',
    '13. 全身症状', '14. 性症状', '15. 疑病', '16. 体重减轻', '17. 自知力'
  ];
  
  const data = [
    ['汉密尔顿抑郁量表(HAMD-17)详情'],
    [],
    ['评估日期', detail.assessment_date || ''],
    ['评估类型', detail.assessment_type_name || ''],
    ['评估者', detail.assessor_name || ''],
    ['总分', detail.hamd_total || 0],
    ['严重程度', getSeverity('hamd', detail.hamd_total || 0)],
    [],
    ['题号', '题目', '得分']
  ];
  
  if (detail.scaleDetails?.hamd) {
    detail.scaleDetails.hamd.forEach((score, idx) => {
      data.push([idx + 1, hamdQuestions[idx] || '', score || 0]);
    });
  }
  
  const ws = XLSX.utils.aoa_to_sheet(data);
  ws['!cols'] = [{ wch: 6 }, { wch: 20 }, { wch: 8 }];
  
  const sheetName = `HAMD_${detail.assessment_date}_${index + 1}`.substring(0, 31);
  XLSX.utils.book_append_sheet(wb, ws, sheetName);
}

/**
 * 创建HAMA详情表
 */
function createHAMADetailSheet(wb, detail, index) {
  const hamaQuestions = [
    '1. 焦虑心境', '2. 紧张', '3. 害怕', '4. 失眠',
    '5. 认知功能', '6. 抑郁心境', '7. 躯体性肌肉症状', '8. 躯体性感觉症状',
    '9. 心血管系统症状', '10. 呼吸系统症状', '11. 胃肠道症状', '12. 泌尿生殖系统症状',
    '13. 自主神经症状', '14. 会谈时行为表现'
  ];
  
  const data = [
    ['汉密尔顿焦虑量表(HAMA-14)详情'],
    [],
    ['评估日期', detail.assessment_date || ''],
    ['评估类型', detail.assessment_type_name || ''],
    ['评估者', detail.assessor_name || ''],
    ['总分', detail.hama_total || 0],
    ['严重程度', getSeverity('hama', detail.hama_total || 0)],
    [],
    ['题号', '题目', '得分']
  ];
  
  if (detail.scaleDetails?.hama) {
    detail.scaleDetails.hama.forEach((score, idx) => {
      data.push([idx + 1, hamaQuestions[idx] || '', score || 0]);
    });
  }
  
  const ws = XLSX.utils.aoa_to_sheet(data);
  ws['!cols'] = [{ wch: 6 }, { wch: 25 }, { wch: 8 }];
  
  const sheetName = `HAMA_${detail.assessment_date}_${index + 1}`.substring(0, 31);
  XLSX.utils.book_append_sheet(wb, ws, sheetName);
}

/**
 * 创建YMRS详情表
 */
function createYMRSDetailSheet(wb, detail, index) {
  const ymrsQuestions = [
    '1. 情绪高涨', '2. 精力和活动增加', '3. 性兴趣', '4. 睡眠',
    '5. 易激惹', '6. 语速和语量', '7. 语言思维紊乱', '8. 思维内容',
    '9. 攻击行为', '10. 外表', '11. 自知力'
  ];
  
  const data = [
    ['杨氏躁狂评定量表(YMRS)详情'],
    [],
    ['评估日期', detail.assessment_date || ''],
    ['评估类型', detail.assessment_type_name || ''],
    ['评估者', detail.assessor_name || ''],
    ['总分', detail.ymrs_total || 0],
    ['严重程度', getSeverity('ymrs', detail.ymrs_total || 0)],
    [],
    ['题号', '题目', '得分']
  ];
  
  if (detail.scaleDetails?.ymrs) {
    detail.scaleDetails.ymrs.forEach((score, idx) => {
      data.push([idx + 1, ymrsQuestions[idx] || '', score || 0]);
    });
  }
  
  const ws = XLSX.utils.aoa_to_sheet(data);
  ws['!cols'] = [{ wch: 6 }, { wch: 20 }, { wch: 8 }];
  
  const sheetName = `YMRS_${detail.assessment_date}_${index + 1}`.substring(0, 31);
  XLSX.utils.book_append_sheet(wb, ws, sheetName);
}

/**
 * 保存工作簿为文件
 */
function saveWorkbook(wb, patientInfo, timeRange) {
  return new Promise((resolve, reject) => {
    try {
      // 生成base64
      const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'base64' });
      
      // 生成文件名
      const patientName = patientInfo?.real_name || '患者';
      const fileName = `${patientName}_详细评估报告_${timeRange}_${formatDate(new Date())}.xlsx`;
      
      // 获取小程序用户目录
      const userDataPath = wx.env.USER_DATA_PATH;
      const filePath = `${userDataPath}/${fileName}`;
      
      // 保存文件
      const fs = uni.getFileSystemManager();
      fs.writeFile({
        filePath: filePath,
        data: wbout,
        encoding: 'base64',
        success: () => {
          resolve({ filePath, fileName });
        },
        fail: (err) => {
          reject(new Error('文件保存失败: ' + err.errMsg));
        }
      });
    } catch (error) {
      reject(error);
    }
  });
}

// ========== 辅助函数 ==========

/**
 * 从完整时间提取时分
 */
function getTimeFromDateTime(dateTimeStr) {
  if (!dateTimeStr) return '';
  const timePart = dateTimeStr.split(' ')[1];
  if (!timePart) return '';
  return timePart.substring(0, 5);
}

/**
 * 获取严重程度描述
 */
function getSeverity(scale, score) {
  if (scale === 'hamd') {
    if (score < 7) return '正常';
    if (score < 17) return '轻度抑郁';
    if (score < 24) return '中度抑郁';
    return '重度抑郁';
  } else if (scale === 'hama') {
    if (score < 7) return '正常';
    if (score < 14) return '轻度焦虑';
    if (score < 21) return '中度焦虑';
    return '重度焦虑';
  } else if (scale === 'ymrs') {
    if (score < 5) return '正常';
    if (score < 15) return '轻度躁狂';
    if (score < 25) return '中度躁狂';
    return '重度躁狂';
  }
  return '未知';
}

/**
 * 计算统计数据
 */
function calculateStats(scores) {
  if (!scores || scores.length === 0) {
    return {
      count: 0,
      max: 0,
      min: 0,
      avg: 0,
      median: 0,
      severity: { normal: 0, mild: 0, moderate: 0, severe: 0 }
    };
  }
  
  const sorted = [...scores].sort((a, b) => a - b);
  const sum = scores.reduce((a, b) => a + b, 0);
  
  // 严重度统计
  const severity = {
    normal: scores.filter(s => s < 7).length,
    mild: scores.filter(s => s >= 7 && s < 17).length,
    moderate: scores.filter(s => s >= 17 && s < 24).length,
    severe: scores.filter(s => s >= 24).length
  };
  
  return {
    count: scores.length,
    max: Math.max(...scores),
    min: Math.min(...scores),
    avg: (sum / scores.length).toFixed(1),
    median: sorted[Math.floor(sorted.length / 2)],
    severity
  };
}

/**
 * 格式化日期
 */
function formatDate(date) {
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  return `${year}${month}${day}`;
}

// 导出（ES6方式）
export { exportPatientAssessmentReport };

